package com.efuture.chapterthree

import java.io.File

/* @Description:apply函数的用法
 * @Auther: zhaoshanshan
 * @Date: 2022/03/06/11:51 上午
 */
fun main() {
    val info = "my name is ZhaoShanShan"
    //普通方式
    println("info字符串的长度是:$info")
    println("info最后一个字符是:${info[info.length-1]}")
    println("info全部转换成小写是:${info.toLowerCase()}")

    //apply内置函数的方式
    //info.apply特点 apply函数始终返回info本身 String 类型
    println("=================")
    val infoStr = info.apply {
        //一般情况下 匿名函数都会持有一个it 但是apply函数不会持有it 却会持有当前的this == info本身
        println("apply匿名函数打印的:$this")
        println("info字符串的长度是:$length")
        println("info最后一个字符是:${this[length-1]}")
        println("info全部转换成小写是:${toLowerCase()}")
    }
    println("infoStr:$infoStr")
    println("=================:info链式调用")
    //真正写apply内置函数的规则如下
    //info.apply特点 apply函数始终返回info本身 String 类型 所以可以链式调用
    info.apply {
        println("info长度是:$length")
    }.apply {
        println("info的最后一个字符是:${this[length-1]}")
    }.apply {
        println("info的全部转换成小写是:${toLowerCase()}")
    }

    //普通写法
    val file = File("src/main/test.txt")
    file.setExecutable(true)
    file.setReadable(true)
    println(file.readLines())

    //apply内置函数的写法
    //匿名函数持有的this ==file本身 this可以省略 所以可以直接通过链式方式直接调用api
    file.apply {
        setExecutable(true)
    }.apply {
        file.setReadable(true)
    }.apply {
        println(file.readLines())
    }

}
